//导入第三方模块 express 返回一个方法对象调用该方法创建服务器
const express = require('express');
//导入系统模块path
const path = require('path');
//导入第三方模块morgan返回一个方法是一个中间件函数该模块的作用是获取请求信息
const morgan = require('morgan');
//导入第三方模块 config
const config = require('config');
//导入第三方模块 body-parser 返回一个方法对象，调用该对象下的urlencoded({extended:false})方法处理post请求参数
const bodyParser = require('body-parser');
//导入连接数据库模块
require('./model/connect');
//导入第三方模块 art-template
const template = require('art-template');
//导入第三方模块dateformat
const dateFormat = require('dateformat');
//向模板内部导入dateFormat变量
template.defaults.imports.dateFormat = dateFormat;
//创建服务器
const app = express();
//导入第三方模块 express-session 返回一个方法 该方法是一个中间件函数
const session = require('express-session');
//调用该方法,方法内部会在req对象下添加session属性，属性值是一个对象，对象存储的是登录成功后的用户信息
app.use(session({
    secret: 'secret key',
    resave: false,
    //当删除cookie后不在客户端保存cookie
    saveUninitialized: false,
    secret: 'aF,.j)wBhq+E9n#aHHZ91Ba!VaoMfC',
    //设置cookie的过期时间
    cookie: { maxAge: 24 * 60 * 60 * 1000 }
}));
//开启静态资源访问服务
app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.urlencoded({ extended: false }));
//告诉express框架用什么模板引擎渲染后缀名为什么的模板文件
app.engine('art', require('express-art-template'));
//配置模板存放目录
app.set('views', path.join(__dirname, 'views'));
//配置模板文件默认后缀名
app.set('view engine', 'art');
// confing模块回自动判断运行环境然后读取对应运行环境下文件的配置信息
console.log(config.get('title'));
//生产和开发环境
//process是全局对象global下的一个属性可以直接调用，该属性值是一个对象
// console.log(process.env.NODE_ENV);
// process.env获取系统的环境变量 返回值是对象
// if (process.env.NODE_ENV == 'development') {
//     // console.log('项目处于开发环境');
//     //在开发环境中将客户端向服务器端的请求信息打印到控制台中
//     app.use(morgan('dev'));
// } else {
//     console.log('项目处于生产环境');
// }
//导入admin路由返回的是 module.exports 对象即admin路由对象
let admin = require('./route/admin');
//导入home路由返回的是 module.exports 对象即home路由对象
let home = require('./route/home');
//给admin路由对象匹配请求地址
//静态资源是有浏览器解析的所以其路径是相对于浏览器的请求地址例如请求路径为 '/abc/adminPage'那么静态资源就是相对于abc目录所以须给外链的静态资源加绝对路径 '/' 浏览器才能够访问静态资源
// server.use('/abc', admin);
//登录拦截
app.use('/admin', require('./middleware/loginGuard'));
app.use('/admin', admin);
//给home路由对象匹配请求地址 
app.use('/home', home);
//配置错误处理中间件
app.use((err, req, res, next) => {
    // JSON.stringify({ path: '/admin/user-edit', id: req.query.id, message: '密码错误,不能修改用户信息' })
    let result = JSON.parse(err);
    let params = [];
    for (let attr in result) {
        if (attr != 'path') {
            params.push(attr + '=' + result[attr]);
        }
    }
    res.redirect(`${result.path}?${params.join('&')}`);
});
//监听端口
app.listen(80)